//需要考虑线程安全问题，在缓冲区中加入临界锁
//数据队列本身就是环形缓冲区


#include "RingBuffer.h"


/*
 *  函数名：void RingBuffer_init(RingBuffer *SrcBuffer)
 *  输入参数：SrcBuffer --> 指向目标缓冲区
 *  输出参数：无
 *  返回值：无
 *  函数作用：初始化缓冲区
*/
void RingBuffer_init(RingBuffer *SrcBuffer)
{
    SrcBuffer->pW = 0;
    SrcBuffer->pR = 0;
}

/*
 *  函数名：void RingBuffer_write(unsigned char c, RingBuffer *SrcBuffer)
 *  输入参数：c --> 要写入的数据
 *            SrcBuffer --> 指向目标缓冲区
 *  输出参数：无
 *  返回值：无
 *  函数作用：向目标缓冲区写入一个字节的数据，如果缓冲区满了就丢掉此数据
 *  空 R == W
*  满 NextW == R  最后一个位置不能写，如果坚持写，会导致W++后 W可能==R，判断为空。
*/
void RingBuffer_write(unsigned char c, RingBuffer *SrcBuffer)
{
    int NextWrite = (SrcBuffer->pW + 1) % BUFFER_SIZE;
    if(NextWrite != SrcBuffer->pR)    // 环形缓冲区没有写满
    {
        SrcBuffer->buffer[SrcBuffer->pW] = c;
        SrcBuffer->pW = NextWrite;
    }
}

/*
 *  函数名：int RingBuffer_read(unsigned char *c, RingBuffer *SrcBuffer)
 *  输入参数：c --> 指向将读到的数据保存到内存中的地址
 *            SrcBuffer --> 指向目标缓冲区
 *  输出参数：无
 *  返回值：读到数据返回0，否则返回-1
 *  函数作用：从目标缓冲区读取一个字节的数据，如果缓冲区空了返回-1表明读取失败
*/
int RingBuffer_read(unsigned char *c, RingBuffer *SrcBuffer)
{
    if(SrcBuffer->pR == SrcBuffer->pW)
    {
        return -1;
    }
    else
    {
        *c = SrcBuffer->buffer[SrcBuffer->pR];
        SrcBuffer->pR = (SrcBuffer->pR + 1) % BUFFER_SIZE;//读位置++
        return 0;
    }
}

